//package com.china.produce.config.db;
//
//import com.china.produce.annotation.DBRouter;
//import org.apache.commons.beanutils.BeanUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.Signature;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import java.lang.reflect.Method;
//
///**
// * @ClassName
// * @Author niujie
// * @Version
// * @Description
// * @CreateTime 2024/3/24
// */
//@Aspect
//@Component
//public class DBRouterJoinPoint {
//
//    private static final Logger LOG = LoggerFactory.getLogger(DBRouterJoinPoint.class);
//
//    @Autowired
//    private DBRouterConfig dbRouterConfig;
//
//    @Pointcut("@annotation(com.china.produce.annotation.DBRouter)")
//    public void aopPoint() {}
//
//
//    @Around("aopPoint() && @annotation(dbRouter)")
//    public Object doRouter(ProceedingJoinPoint joinPoint, DBRouter dbRouter) throws Throwable {
//
//        String dbKey = dbRouter.key();
//
//        if(StringUtils.isBlank(dbKey)) throw new RuntimeException("");
//
//        String dbKeyAttr = getAttrValue(dbKey, joinPoint.getArgs());
//
//        int size = dbRouterConfig.getDbCount() * dbRouterConfig.getTbCount();
//
//        // 扰动函数
//        int idx = (size - 1) & (dbKeyAttr.hashCode() ^ (dbKeyAttr.hashCode() >>> 16));
//        // 库表索引
//        int dbIdx = idx / dbRouterConfig.getTbCount() + 1;
//        int tbIdx = idx - dbRouterConfig.getTbCount() * (dbIdx - 1);
//        // 设置到 ThreadLocal
//        DBContextHolder.setDBKey(String.format("%02d", dbIdx));
//        DBContextHolder.setTBKey(String.format("%02d", tbIdx));
//        LOG.info("数据库路由 method：{} dbIdx：{} tbIdx：{}", getMethod(joinPoint).getName(), dbIdx, tbIdx);
//        // 返回结果
//        try {
//            return joinPoint.proceed();
//        } finally {
//            DBContextHolder.clearDBKey();
//            DBContextHolder.clearTBKey();
//        }
//    }
//
//    public static void main(String[] args) {
//        String a = "12345";
//        int b = (16 - 1) & (a.hashCode() ^ a.hashCode() >>> 16);
//        System.out.println(b);
//    }
//
//    /**
//     * 获取方法
//     *
//     * @param jp
//     * @return
//     * @throws NoSuchMethodException
//     */
//    private Method getMethod(JoinPoint jp) throws NoSuchMethodException {
//        Signature sig = jp.getSignature();
//        MethodSignature methodSignature = (MethodSignature) sig;
//        return jp.getTarget().getClass().getMethod(methodSignature.getName(), methodSignature.getParameterTypes());
//    }
//
//    /**
//     * 参数一样的请求，都是在同一张表中
//     *
//     * @param attr
//     * @param args
//     * @return
//     */
//    public String getAttrValue(String attr, Object[] args) {
//        String filedValue = null;
//        for (Object arg : args) {
//            try {
//                if (StringUtils.isNotBlank(filedValue)) break;
//                filedValue = BeanUtils.getProperty(arg, attr);
//            } catch (Exception e) {
//                LOG.error("获取路由属性值失败 attr：{}", attr, e);
//            }
//        }
//        return filedValue;
//    }
//
//}
